package com.starrocks.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.starrocks.entity.SyncConfigEntity;
import com.starrocks.entity.SyncTargetEntity;
import com.starrocks.mapper.SyncConfigMapper;
import com.starrocks.mapper.SyncTargetMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 同步配置服务
 * 管理数据库中的同步配置
 */
@Slf4j
@Service
public class SyncConfigService extends ServiceImpl<SyncConfigMapper, SyncConfigEntity> {
    
    @Autowired
    private SyncTargetMapper syncTargetMapper;
    
    /**
     * 查询所有启用的同步配置（包含启用的目标表信息，用于同步服务）
     */
    public List<SyncConfigEntity> listEnabledConfigs() {
        QueryWrapper<SyncConfigEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("enabled", true);
        wrapper.orderByAsc("id");
        
        List<SyncConfigEntity> configs = list(wrapper);
        
        // 为每个配置加载启用的目标表列表（只加载enabled=true的）
        for (SyncConfigEntity config : configs) {
            List<SyncTargetEntity> targets = listEnabledTargetsByConfigId(config.getId());
            config.setTargets(targets);
        }
        
        return configs;
    }
    
    /**
     * 根据源表名查询配置（包含启用的目标表信息，用于同步服务）
     */
    public SyncConfigEntity getBySourceTableName(String sourceTableName) {
        QueryWrapper<SyncConfigEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("source_table_name", sourceTableName);
        wrapper.eq("enabled", true);
        
        SyncConfigEntity config = getOne(wrapper);
        if (config != null) {
            List<SyncTargetEntity> targets = listEnabledTargetsByConfigId(config.getId());
            config.setTargets(targets);
        }
        
        return config;
    }
    
    /**
     * 根据配置ID查询所有启用的目标表（用于同步服务）
     */
    public List<SyncTargetEntity> listEnabledTargetsByConfigId(Long configId) {
        QueryWrapper<SyncTargetEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("config_id", configId);
        wrapper.eq("enabled", true);
        wrapper.orderByAsc("sort_order");
        
        return syncTargetMapper.selectList(wrapper);
    }
    
    /**
     * 根据配置ID查询所有目标表（包括禁用的，用于配置编辑）
     */
    public List<SyncTargetEntity> listTargetsByConfigId(Long configId) {
        QueryWrapper<SyncTargetEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("config_id", configId);
        wrapper.orderByAsc("sort_order");
        
        return syncTargetMapper.selectList(wrapper);
    }
    
    /**
     * 保存完整的同步配置（包括目标表）
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean saveWithTargets(SyncConfigEntity config) {
        // 1. 检查源表名是否已存在（新增时检查，更新时检查是否与其他记录冲突）
        QueryWrapper<SyncConfigEntity> checkWrapper = new QueryWrapper<>();
        checkWrapper.eq("source_table_name", config.getSourceTableName());
        if (config.getId() != null) {
            // 更新时，排除自己
            checkWrapper.ne("id", config.getId());
        }
        long count = count(checkWrapper);
        if (count > 0) {
            String message = String.format("源表 [%s] 已存在同步配置，请勿重复添加", config.getSourceTableName());
            log.warn(message);
            throw new RuntimeException(message);
        }
        
        // 2. 保存主配置
        boolean success = saveOrUpdate(config);
        
        if (success && config.getTargets() != null) {
            // 3. 删除旧的目标表配置
            QueryWrapper<SyncTargetEntity> deleteWrapper = new QueryWrapper<>();
            deleteWrapper.eq("config_id", config.getId());
            syncTargetMapper.delete(deleteWrapper);
            
            // 4. 保存新的目标表配置
            for (SyncTargetEntity target : config.getTargets()) {
                target.setConfigId(config.getId());
                syncTargetMapper.insert(target);
            }
        }
        
        return success;
    }
    
    /**
     * 删除配置（级联删除目标表）
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteWithTargets(Long configId) {
        // 删除目标表配置
        QueryWrapper<SyncTargetEntity> targetWrapper = new QueryWrapper<>();
        targetWrapper.eq("config_id", configId);
        syncTargetMapper.delete(targetWrapper);
        
        // 删除主配置
        return removeById(configId);
    }
}

